package com.atguigu.dao.impl;

import com.atguigu.utils.JdbcUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

public abstract class BaseDao {
    //使用DbUtiles操作数据库
    private QueryRunner db=new QueryRunner();

    /**
     * undate()方法用来执行insert/update/delete语句
     * @return
     */
    public int updatedate(String sql,Object...args){
        Connection conn = JdbcUtils.getConnection();
        try {
            return db.update(conn,sql,args);
        } catch (Exception e) {
            e.printStackTrace();
            throw  new RuntimeException(e);
            //异常都要向外抛，这样后面的方法才能捕获到异常，才能引发回滚(向外抛就不需要return了)
            //返回-1说明执行失败
//            return -1;
        }
    }
    /**
     * 查询返回结果为一个javaBean的sql对象
     * @param type  返回对象类型
     * @param sql   sql语句
     * @param arge  sql对应的参数值
     * @param <T>   返回类型的泛型
     * @return
     */
    public <T> T querydate(Class<T> type,String sql,Object...arge){
        Connection conn = JdbcUtils.getConnection();
        BeanHandler<T> bh=new BeanHandler<T>(type);
        try {
            return db.query(conn,sql,bh,arge);
        } catch (Exception e) {
            e.printStackTrace();
            throw  new RuntimeException(e);
            //异常都要向外抛，这样后面的方法才能捕获到异常，才能引发回滚(向外抛就不需要return了)
//            return null;
            //返回null表示查询失败
        }
    }
    /**
     * 查询返回结果为多个javaBean的sql对象
     * @param type  返回对象类型
     * @param sql   sql语句
     * @param args  sql对应的参数值
     * @param <T>   返回类型的泛型
     * @return
     */
    public <T>List<T> querydates(Class<T> type,String sql,Object...args){
        Connection conn = JdbcUtils.getConnection();
        BeanListHandler<T> blh=new BeanListHandler<T>(type);
        try {
            return db.query(conn,sql,blh,args);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
            throw  new RuntimeException(throwables);
            //异常都要向外抛，这样后面的方法才能捕获到异常，才能引发回滚(向外抛就不需要return了)
//            return null;
            //返回null表示查询失败
        }
    }

    /**
     * 执行查询特殊值的操作【接返回一行一列一个单元格，是一个具体值】
     * @param sql       sql语句
     * @param args      sql语句对应的参数值
     * @return
     */
    public Object queryvalue(String sql,Object...args){
        Connection conn = JdbcUtils.getConnection();
        try {
            return db.query(conn,sql,new ScalarHandler(),args);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
            throw  new RuntimeException(throwables);
            //异常都要向外抛，这样后面的方法才能捕获到异常，才能引发回滚(向外抛就不需要return了)
//            return null;
        }
    }
}
